虚函数

  怎样才能将 f() 里对 s_ref.pop() 的调用解析为正确的函数定义呢?当 f()h() 调用时,实际上必须去调用 List_stack::pop()。为能得到这种解析,在 Stack 对象里就必须包含某些信息,指明在程序运行中应该调用的函数。一种常用的实现技术是让编辑器把一个 virtual 函数的名字转换为指向这些函数的指针表的一个下标。这种表通常被称为“虚函数表”,简称vtbl。每个带有虚函数的类都有标识着它的所有虚函数的 vtbl,这个情况可以用下图表示:

即使调用者并不知道对象的大小以及它的数据布局,位于 vtbl 里的函数也使对象能正确地使用。调用者需要知道的所有东西就是 Stack 的那个 vtbl 的位置,以及对各个虚函数应该使用的下标。这种虚函数调用机制的效率可以做得基本上与“正常函数调用”机制相同。其空间开销是带有虚函数的类的每个对象里包含一个指针,而每个这样的类需要有一个 vtbl

🔚